package main

import "fmt"

type user struct{ name string }

func main() {
	m := map[string]int{
		"a": 1,
	}
	if v, ok := m["a"]; ok { // 判断 key 是否存在。
		println("value", v)
	}
	println("not exists", m["c"]) // 对于不存在的 key，直接返回 \0，不会出错。
	m["b"] = 2                    // 新增或修改。
	m["a"] = 3                    // 新增或修改。
	delete(m, "c")                // 删除。如果 key 不存在，不会出错。
	println(len(m))               // 获取键值对数量。cap ⽆无效。
	for k, v := range m {         // 迭代，可仅返回 key。随机顺序返回，每次都不相同。
		println(k, v)
	}

	m1 := map[int]user{ // 当 map 因扩张⽽而重新哈希时，各键值项存储位置都会发⽣生改变。 因此，map
		1: {"user1"}, // 被设计成 not addressable。 类似 m[1].name 这种期望透过原 value
	} // 指针修改成员的⾏行为⾃自然会被禁⽌止。
	// m1[1].name = "Tom" // Error: cannot assign to m[1].name

	u := m1[1]
	u.name = "Tom"
	m1[1] = u // 替换 value。
	fmt.Println(m1[1])

	// 匿名结构
	var attr = struct {
		perm  int
		owner int
	}{2, 0755}

	fmt.Println(attr.owner)

	// 空结构 "节省" 内存，比如用来实现 set 数据结构，或者实现没有 "状态" 只有方法的 "静态类"。
	var null struct{}
	set := make(map[string]struct{})
	set["a"] = null
}
